home *** CD-ROM | disk | FTP | other *** search
/ Hottest 6 / Hottest 6 (1996)(PDSoft)[!].iso / software / emulators / frodo_1.5 / src / 6581.asm < prev    next >
Assembly Source File  |  1978-11-24  |  5KB  |  279 lines

  1. *
  2. * 6581.asm - SID-Emulation
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsprinzip:
  12. *  - Es bestehen zwei Möglichkeiten zur SID-Emulation, die über das
  13. *    Flag UseSIDCard ausgewählt werden. Zum einen die Verwendung der
  14. *    SID-Karte, zum anderen die der "6581sid.library"
  15. *
  16. * SID-Karte:
  17. *  - Die SID-Karte enthält einen echten C64-SID, der im Adreßraum
  18. *    $a00001-$a00039 (Register an den ungeraden Adressen) eingeblendet
  19. *    ist (z.B. auf einer Zorro-II-Karte)
  20. *  - Wegen Timing-Problemen mit der Karte werden Lesezugriffe aus
  21. *    SID-Registern nur simuliert
  22. *  - Die Power-LED ist mit dem Reset-Eingang des SID verbunden,
  23. *    d.h. ein kurzes Aus- und Einschalten der LED setzt den SID
  24. *    zurück
  25. *
  26.  
  27.         MACHINE    68020
  28.  
  29.         INCLUDE    "exec/types.i"
  30.         INCLUDE    "exec/macros.i"
  31.         INCLUDE    "exec/nodes.i"
  32.         INCLUDE    "hardware/intbits.i"
  33.  
  34.         XREF    _SysBase
  35.         XREF    _GfxBase
  36.         XREF    _SID6581Base
  37.  
  38.         XREF    Random
  39.  
  40.         XDEF    Reset6581
  41.         XDEF    ReadFrom6581
  42.         XDEF    WriteTo6581
  43.         XDEF    PauseSound
  44.         XDEF    ResumeSound
  45.         XDEF    ChangedSID
  46.         XDEF    CloseSID
  47.         XDEF    UseSIDCard    ;Prefs
  48.  
  49.         SECTION    "CODE",CODE
  50.  
  51. *
  52. * Definitionen
  53. *
  54.  
  55. ; 6581sid.library
  56. SID_AllocSID    = -30
  57. SID_FreeSID    = -36
  58. SID_Interrupt    = -42
  59. SID_Initialize    = -48
  60. SID_ResetSID    = -54
  61. SID_IRQOnOff    = -60
  62. SID_ReadReg    = -72
  63. SID_WriteReg    = -78
  64.  
  65. ; SID Handle Struktur
  66. sid_Enabled    = 4
  67. sid_Filter    = 5
  68. sid_60Hz    = 6
  69. sid_RingQual    = 7
  70. sid_SyncQual    = 8
  71. sid_ADSRQual    = 13
  72. sid_IRQRate    = 18
  73.  
  74.  
  75. **
  76. ** SID-Einstellung wurde verändert.
  77. ** Emulation über Library ein-/ausschalten
  78. **
  79.  
  80. ChangedSID    tst.w    UseSIDCard
  81.         beq    OpenSID
  82.  
  83. ; Emulation über Library ausschalten
  84. CloseSID    move.l    SIDHandle,d0
  85.         beq    1$
  86.  
  87.         move.l    a6,-(sp)
  88.         move.l    _SID6581Base,a6        ;SID abschalten
  89.         move.l    d0,a1
  90.         moveq    #-1,d0
  91.         jsr    SID_IRQOnOff(a6)
  92.  
  93.         move.l    _SysBase,a6        ;VBI entfernen
  94.         lea    VBInterrupt,a1
  95.         moveq    #INTB_VERTB,d0
  96.         JSRLIB    RemIntServer
  97.  
  98.         move.l    _SID6581Base,a6
  99.         move.l    SIDHandle,a1        ;Und SIDHandle freigeben
  100.         jsr    SID_FreeSID(a6)
  101.         clr.l    SIDHandle
  102.         move.l    (sp)+,a6
  103. 1$        rts
  104.  
  105. ; Emulation über Library einschalten
  106. OpenSID        tst.l    SIDHandle
  107.         bne    1$
  108.  
  109.         move.l    _SID6581Base,d0        ;6581sid.library offen?
  110.         beq    1$
  111.  
  112.         move.l    a6,-(sp)        ;Ja, SIDHandle holen
  113.         move.l    d0,a6
  114.         jsr    SID_AllocSID(a6)
  115.         move.l    d0,SIDHandle
  116.         beq    2$
  117.  
  118.         move.l    d0,a1            ;Parameter setzen
  119.         st.b    sid_Enabled(a1)
  120.         clr.b    sid_Filter(a1)
  121.         st.b    sid_60Hz(a1)
  122.         move.b    #48,sid_RingQual(a1)
  123.         move.b    #48,sid_SyncQual(a1)
  124.         move.b    #48,sid_ADSRQual(a1)
  125.         move.w    #60,sid_IRQRate(a1)
  126.         jsr    SID_Initialize(a6)
  127.  
  128.         move.l    SIDHandle,a1        ;SID anschalten
  129.         moveq    #0,d0
  130.         jsr    SID_IRQOnOff(a6)
  131.  
  132.         move.l    _SysBase,a6        ;VBI einrichten
  133.         lea    VBInterrupt,a1
  134.         moveq    #INTB_VERTB,d0
  135.         JSRLIB    AddIntServer
  136.  
  137. 2$        move.l    (sp)+,a6
  138. 1$        rts
  139.  
  140.  
  141. **
  142. ** Interrupt-Routine
  143. ** a1: SIDHandle
  144. **
  145.  
  146. IntProc        move.l    _SID6581Base,a6
  147.         jsr    SID_Interrupt(a6)
  148.         moveq    #0,d0            ;Nächsten Server aufrufen
  149.         rts
  150.  
  151.  
  152. **
  153. ** Sound stummschalten
  154. **
  155.  
  156. PauseSound    move.l    SIDHandle,d0
  157.         beq    1$
  158.         move.l    a6,-(sp)
  159.         move.l    _SID6581Base,a6
  160.         move.l    d0,a1
  161.         moveq    #-1,d0
  162.         jsr    SID_IRQOnOff(a6)
  163.         move.l    (sp)+,a6
  164. 1$        rts
  165.  
  166.  
  167. **
  168. ** Sound wieder laut machen
  169. **
  170.  
  171. ResumeSound    move.l    SIDHandle,d0
  172.         beq    1$
  173.         move.l    a6,-(sp)
  174.         move.l    _SID6581Base,a6
  175.         move.l    d0,a1
  176.         moveq    #0,d0
  177.         jsr    SID_IRQOnOff(a6)
  178.         move.l    (sp)+,a6
  179. 1$        rts
  180.  
  181.  
  182. **
  183. ** SID zurücksetzen
  184. **
  185.  
  186. Reset6581    move.l    a6,-(sp)
  187.         tst.w    UseSIDCard
  188.         beq    1$
  189.         move.l    _GfxBase,a6
  190.         JSRLIB    WaitTOF
  191.         bset    #1,$bfe001    ;LED aus
  192.         JSRLIB    WaitTOF
  193.         bclr    #1,$bfe001    ;LED an
  194.         move.l    (sp)+,a6
  195.         rts
  196.  
  197. 1$        move.l    SIDHandle,d0
  198.         beq    2$
  199.         move.l    _SID6581Base,a6
  200.         move.l    d0,a1
  201.         jsr    SID_ResetSID(a6)
  202. 2$        move.l    (sp)+,a6
  203.         rts
  204.  
  205.  
  206. **
  207. ** Aus einem SID-Register lesen
  208. ** d0.w: Registernummer ($00-$1f)
  209. ** Rückgabe: d0.b: Byte
  210. **
  211. ** Darf das obere Wort von d0 und d1 nicht verändern!
  212. ** Darf a1 nicht verändern!
  213. **
  214.  
  215. ReadFrom6581    cmp.b    #$19,d0
  216.         beq    ReadFF
  217.         cmp.b    #$1a,d0
  218.         beq    ReadFF
  219.         cmp.b    #$1b,d0
  220.         beq    ReadRnd
  221.         moveq    #0,d0
  222.         rts
  223.  
  224. ReadFF        move.b    #-1,d0        ;A/D-Wandler
  225.         rts
  226.  
  227. ReadRnd        jsr    Random
  228.         moveq    #0,d1        ;MSW löschen
  229.         rts
  230.  
  231.  
  232. **
  233. ** In ein SID-Register schreiben
  234. ** d0.w: Registernummer ($00-$1f)
  235. ** d1.b: Byte
  236. **
  237. ** Darf das obere Wort von d0 und d1 nicht verändern!
  238. **
  239.  
  240. WriteTo6581    tst.w    UseSIDCard
  241.         beq    1$
  242.         lea    $a00001,a0    ;SID-Karte
  243.         move.b    d1,(a0,d0.w*2)
  244.         rts
  245.  
  246. 1$        tst.l    SIDHandle
  247.         beq    2$
  248.         move.l    a6,-(sp)
  249.         move.l    _SID6581Base,a6
  250.         move.l    SIDHandle,a1    ;d0: Regnum, d1: Byte
  251.         jsr    SID_WriteReg(a6)
  252.         move.l    (sp)+,a6
  253.         moveq    #0,d0
  254.         moveq    #0,d1
  255. 2$        rts
  256.  
  257.  
  258. **
  259. ** Konstanten
  260. **
  261.  
  262. IntName        dc.b    "Frodo SID VBI",0
  263.  
  264. **
  265. ** Datenbereich
  266. **
  267.  
  268.         SECTION    "DATA",DATA
  269.  
  270. VBInterrupt    dc.l    0,0
  271.         dc.b    NT_INTERRUPT,0
  272.         dc.l    IntName
  273. SIDHandle    dc.l    0    ;Handle für die 6581sid.library und Flag, daß sie verfügbar ist
  274.         dc.l    IntProc
  275.  
  276. UseSIDCard    dc.w    0    ;Flag: SID-Karte ansprechen
  277.  
  278.         END
  279.